home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / freeWAIS-sf-1.1 / ir / hash.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-19  |  3.7 KB  |  117 lines

  1. /* hash table routines.  not very general.
  2.  * -brewster
  3.  */
  4.  
  5. /* Copyright (c) CNIDR (see ../COPYRIGHT) */
  6.  
  7.  
  8. #ifndef HASH_H
  9. #define HASH_H
  10.  
  11.  
  12. #define DEFAULT_NUMBER_OF_BUCKETS 65536L
  13. #define DEFAULT_NUMBER_OF_ELEMENTS 131072L
  14.  
  15. #define MAX_KEY_SIZE 20 /* this is the string length, so add 1 */
  16.  
  17. typedef struct hash_entry{
  18.   char key[MAX_KEY_SIZE + 1];    /* the key.  Must be first */
  19.   long next;    /* index of the next entry in the contents */
  20.  
  21.  
  22.   /* This part is usage dependent.  Sucks that it is hard coded. (this 
  23.    * was done for efficiency. C sucks.)
  24.    * however, this can be made to be somewhat flexible, by pulling this out
  25.    * into a different .h file, and redefining the structure for different 
  26.    * purposes.  This can be done in the same application since all the 
  27.    * hashtable code cares about is the key and next values.
  28.    * (actually, not quite, take out array refs to contents in hash.c
  29.    *  and replace by explicit multiplies and it will work).
  30.    */
  31.   
  32.   long number_of_occurances;    /* total for the whole db */
  33.   unsigned char* memory_ptr;        /* what will go into the next block */
  34.   unsigned char* current_memory_ptr;    /* the fill ptr into memory_ptr */
  35.   long memory_size;        /* the size of memory_ptr */
  36.   long current_doc_id;        /* the last document-id in memory_ptr
  37.                  * this will change a page pointer eventually
  38.                  */
  39. #ifdef NEW_WEIGHT /* tung, 5/94 */
  40.   long occurances_in_doc;        /* frequency of word in a document */
  41. #endif
  42. } hash_entry;
  43.  
  44. typedef struct hashtable{
  45.   long number_of_buckets;    /* number of buckets */
  46.   long buckets_mask;        /* a mask for fast bitwise and'ing */
  47.   long element_size;        /* sizeof the element to be stored 
  48.                    (including th hash_entry_header) */
  49.   long number_of_elements;    /* total number of elements hashed */
  50.   long max_number_of_elements;    /* size of the contents buffer in elements */
  51.  
  52.   long *buckets;        /* array of longs, each an index into contents
  53.                  * -1 is an empty entry. */
  54.   hash_entry* contents;        /* pointer to hashtable memory */
  55.  
  56. } hashtable;
  57.  
  58.  
  59. #ifdef __cplusplus
  60. /* declare these as C style functions */
  61. extern "C"
  62.     {
  63. #endif /* def __cplusplus */
  64.  
  65.  
  66. /* number_of_buckets must be a power of 2, 
  67.       if -1 then it defaults to DEFAULT_NUMBER_OF_BUCKETS.
  68.    number_of_elements is the number of expected elements that will be hashed.
  69.    element_size must be the sizeof the element to be put in the hashtable 
  70.        (not including hash_entry_header).
  71.    returns NULL if an error
  72.  */
  73. hashtable *make_hashtable _AP ((long number_of_buckets, 
  74.                  long number_of_elements,
  75.                  long element_size));
  76.  
  77. /* returns a pointer to the element stored or NULL if none. */
  78. hash_entry *get_hash _AP ((char *key, hashtable *htable));
  79.  
  80. /* puts a copy of the element into the hashtable.
  81.    Returns a pointer to the new element.
  82.  
  83.    This does not check to see that the key has not already been added. */
  84. hash_entry *put_hash _AP ((char *key, hashtable *htable, hash_entry *element));
  85.  
  86. /* not implemented yet 
  87. boolean rem_hash _AP ((char *key, hashtable *htable));
  88.  */
  89.  
  90. /* removes contents without freeing memory.
  91.    returns true if successful, false otherwise */
  92. boolean clr_hashtable _AP ((hashtable *htable));
  93.  
  94. /* removes contents and free's memory for the hastable.   
  95.    returns true if successful, false otherwise */
  96. boolean free_hashtable _AP ((hashtable *htable));
  97.  
  98. long hashtable_count _AP ((hashtable *htable));
  99.  
  100. /* sorts the contents of elements of the hastable.
  101.    this destroys the hashtable */
  102. boolean sort_hashtable _AP ((hashtable *htable));
  103.  
  104. #ifdef FIELDS /* tung, 1/94 */
  105. boolean sort_hashtable_numeric _AP ((hashtable *htable));
  106. #endif
  107.  
  108. void analyze_hashtable_distribution _AP ((hashtable * htable));
  109. void print_hashtable _AP ((hashtable *htable));
  110.  
  111.  
  112. #ifdef __cplusplus
  113.     }
  114. #endif /* def __cplusplus */
  115.  
  116. #endif /* nded HASH_H */
  117.